package com.lmz.project.redis.arithmetic;

import java.util.Arrays;

public class SortTest {
    //交换数组中的两位之上的数
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


//    public static void main(String[] args) {
//        int[] arr = {3, 4, 5, 2, 1};
////        selectSort(arr);
////        bubbleSort(arr);
//        insertSort(arr);
//        System.out.println(Arrays.toString(arr));
//
////        System.out.println(9/0);
//    }

    //对数器,验证是三种排序是否真正对于所有数组效果一致
    public static void main(String[] args) {
        int V = 100; //数组范围最大值
        int n = 10; //数组长度
        int testTimes = 50000 ; //实验测试次数
        System.out.println("测试开始");
        for (int i = 0; i < testTimes; i++) {
            int[] intArr = createIntArr(V, n);
            int[] ints1 = copyArr(intArr);
            int[] ints2 = copyArr(intArr);
            int[] ints3 = copyArr(intArr);
            //分别用三种排序去执行,对比结果是否一致
            selectSort(ints1);
            bubbleSort(ints2);
            insertSort(ints3);
            if (!(isSameArr(ints1,ints2) && isSameArr(ints1,ints3))) {
                System.out.println("测试出错");
            }
        }
        System.out.println("测试结束");
    }

    //根据长度,范围生成数组
    public static int[] createIntArr(int V,int n){
        int[] nums=new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] =(int) (Math.random() * V) +1;
        }
        return nums;
    }

    public static int[] copyArr(int[] arr){
        int n = arr.length;
        int[] copyArr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            copyArr[i] = arr[i];
        }
        return copyArr;
    }

    //查看两个数组都每个值是否都相同
    public static boolean isSameArr(int[] nums1,int[] nums2){
        int n = nums1.length;
        for (int i = 0; i < n; i++) {
            if (nums1[i] != nums2[i]){
                return false;
            }
        }
        return true;
    }

    //选择排序
    public static void selectSort(int arr[]) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            swap(arr, i, minIndex);
        }
    }

    //插入排序
    public static void insertSort(int arr[]) {
        if (arr == null || arr.length == 2) {
            return;
        }
        //认为前i项数组都是已经有顺序了
        for (int i = 1; i < arr.length; i++) {
            for (int j = i; j > 0 && arr[j] < arr[j-1]; j--) {
                if (arr[j] < arr[j-1]) {
                    swap(arr, j, j - 1);
                }
            }
        }
    }

    //冒泡排序
    public static void bubbleSort(int[] arr) {
        if (arr == null && arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }

    }
}
